\chapter{その他の機能}
\section{Idle Timer}
しばらくパケットの流れがないと自動的に回線を切断するidle timer機能が
実装されています。ディフォルトのタイムアウト時間は180秒の設定となっています。
変更したい場合には、\verb|set timeout|コマンドを使ってください

\begin{screen}\baselineskip12pt
  \begin{verbatim}
ppp> set timeout 120
ppp> show timeout
 Idle Timer: 120 secs   LQR Timer: 30 secs
ppp>
  \end{verbatim}
\end{screen}

自動モードで動作している場合には、切断後パケットの流れを検出すると、
再度自動的にダイアリングがおこなわれます。
Idle timerが動作した場合には、リンク層での接続は切断されても、
TCP層での切断は接続されないことに注意してください。
たとえば、telnetを使ってリモートホストにログインしていた場合には、
回線が切断されても、telnetのセッションは残ったままになっています。

%\begin{screen}\baselineskip12pt
%  \begin{verbatim}
%PPP> show timeout
%PPP> show ipcp
%  \end{verbatim}
%\end{screen}

\section{ログ機能}\label{debug}
オプションの調停の様子やパケットの流れをログ・ファイルに記録する
ことが可能です。PPPを起動すると、{\tt ppp.log}という名前のファイルが
生成されます。このファイルに記録される情報の内容は、{\tt set debug}
コマンドによって指定することができます。
低レベルのログの記録を指定するほど記録される情報量は多くなりますが、
その分オーバヘッドが大きくなりますので注意してください。Asyncレベルの
指定をしてftpを使ったりするとログファイルはアッという間にメガ単位に
なりますよ。

記録するレベルとしては、以下のものが指定できます。指定の際に、
複数のレベルを指定すれば、それぞれのレベルでの記録が生成されます。

\begin{table}[htbp]
  \begin{center}
    \leavevmode
    \begin{tabular}[h]{|l|l|}
\hline
phase & フェーズの遷移の様子を記録します。\\
chat & モデムとのチャットの様子を記録します。\\
lqm & LQMのレポートを記録します。\\
lcp & LCP/IPCP/CHAPの動作の様子を記録します。\\
tcp/ip & IPパケットの流れの様子を記録します。\\
hdlc & HDLCのレベルで、流れるパケットの内容を全て記録します。\\
async & モデムとの間で流れるデータを全て記録します。\\
\hline
    \end{tabular}
  \end{center}
\end{table}


\section{能動的オープン}
本PPPの実装では、相手側がPPPでの接続を開始するまでは、
こちら側からは何も接続動作をおこなわないようになっています。
これは、LCPを受動的にオープンするようになっているためです。

ところが、接続先によっては相手も受動的にLCPをオープンする場合も
考えられます。そのような場合には互いに相手がLCPを話し始めるの
を待ってしまい、いつまで待っても接続ができないことに
なってしまいます。そこで、本実装では{\em set openmode}を使って
能動的にオープンすることを指示することができるようになっています。
現在の設定が受動的(passive)と能動的(active)のどちらになっているかは、
{\em show lcp}コマンドによって確認することができます。

\begin{screen}\baselineskip12pt
 \begin{example}
ppp> set openmode active
ppp> show lcp
LCP [Closed]
 his side: MRU 576, ACCMAP 00000000, PROTOCOMP 1, ACFCOMP 1 MAGIC 649fe9fb
 my  side: MRU 512, ACCMAP 00000000, PROTOCOMP 1, ACFCOMP 1 MAGIC fd56a490

Defaults:   MRU = 512, ACCMAP = 00000000        Open Mode: active
ppp>
 \end{example}
\end{screen}

\section{仮想的なネットワークの構築}
既存のネットワークを利用してPPPを使うと、ネットワークを経由しているのに
もかかわらず仮想的に2点間を直接つないでいるように見せかけることができます。
このテクニックを使えば、外のネットワークからアクセスしているのにも
かかわらず、あたかも自分の会社のネットワークに直接つなげているような
環境も構築できます。

\subsection{PPP over TELNET}
まず最初に紹介する例は、TELNETプロトコルの上で、PPPを走らせるものです。
会社側のネットワークに端末サーバが用意してあり、そこにダイアルする
ことにより、社内のネットワークにtelnet経由でログインするすることが
できると想定しましょう。端末サーバはtelnetの機能しかもっていないので、
ログインすることはできても、ftpを使って会社のマシンから自分のマシンに
ファイルを転送するようなことはできません。しかし、telnetのプロトコルの
上でさらにPPPを走らせることができれば、端末サーバが間に介在している
ことを無視して、仮想的にtelnetしているホストと自分のマシンがPPPを使って
IP的に接続されることになりますから、ftpを使うこともできるように
なってしまいます。

具体的には、つぎのような手順でこのような仮想的なIPリンクを作成する
ことができます。

\begin{enumerate}
\item 自分側のマシンでPPPを起動したら、escapeコマンドを使って
  telnetプロトコルが自分のコマンドを処理するために利用する
  IAC(0xff)のコードをPPPではエスケープして通すことを指定してやります。
  \begin{screen}\baselineskip12pt
    \begin{example}
%{\it ppp}
User Process PPP. Written by Toshiharu OHNO.
Log level is 09
Using interface: tun0
Interactive mode
ppp> set escape 0xff
ppp>      
    \end{example}
  \end{screen}
\item termコマンドを使って
 モデムからダイアリングすることにより会社の端末サーバにアクセスします。
 \begin{screen}\baselineskip12pt
   \begin{example}
ppp>{\it term\/}
Enter to terminal mode.
Type `~?' for help
at
OK
atdt0399991111

CONNECT
   \end{example}
 \end{screen}
\item ここでは、端末サーバに接続されるとtelnetで接続する相手の
  ホスト名を聞いてくるものと仮定しましょう。
  \begin{screen}\baselineskip12pt
    \begin{example}
Host:{\it remote\/}

SunOS UNIX (remote.iij.ad.jp)

login:
    \end{example}
  \end{screen}
  リモートホストにtelnetで接続されてUnixのログインプロンプトがでて
  きますので、ユーザ名とパスワードを入力して普通にログインします。
\item リモートホスト側でもescapeの指定を付けてpppを走らせます。
  ここでは、Sun用のフリーのPPPである ppp-2.1.2を使うもとの仮定します。
  \begin{screen}
    \begin{example}
% /usr/local/etc/pppd 192.244.188.3:192.244.188.4 escape 0xff
    \end{example}
  \end{screen}
  この例では、Sun側のアドレスを192.244.188.3, 手元のマシン
  側のアドレスを192.244.188.4と指定しています。
\item 相手側でPPPを起動したので、PPPのパケットがtelnetの上を
  流れて手元の自分のマシンに到達します。手元のマシンはそれに自動的に
  応答してPPPの接続を確立し、192.244.188.4というアドレスが与えられ
  ます。
  \begin{screen}\baselineskip12pt
    \begin{example}
ppp>
PPP>{\it show ipcp}
IPCP [Opend]
his side: 192.244.188.3, 2d0f01
my  side: 192.244.188.4, 2d0f00
connected: 3 secs, idle: 3 secs

Defaults:  My Address: 192.244.176.10  His Address: 0.0.0.0
PPP>
    \end{example}
  \end{screen}
\end{enumerate}

\subsection{PPP over TCP}
自分の利用するマシンがIPネットワークに接続されているのであれば、
TCPの任意のポート上にPPPを載せることにより、IPネットワークを経由した
仮想的な直接リンクを作成することが可能です。ここでは、接続相手と
してMorning StartのPPPを使うものと仮定します。

\begin{enumerate}
\item まず、接続先の側で未使用のポートを仮想PPPリンクで使用する
  ために割当てます。ここでは、2456番ポートを使うこととし、
  {\tt /etc/services}に登録します。
  \begin{screen}
    \begin{verbatim}
ppp     2456/tcp
    \end{verbatim}
  \end{screen}
\item 上記のポートへの接続があったらPPPが走るように{\tt /etc/inetd.conf}に
  サービスを登録しておきます。
  \begin{screen}
    \begin{verbatim}
ppp  stream  tcp   nowait  root  /usr/etc/pppd pppd 192.244.188.3:192.244.188.4
    \end{verbatim}
  \end{screen}
  登録したら、{\it inetd\/}に{\tt HUP}シグナルを送り、{\tt inetd.conf}を
  読み込み直させておきます。
\item 自分側のマシンではモデムのデバイス指定で、ttyを指定する変わりに
  リモードマシンのIPアドレスとポード番号を指定します。{\it term\/}コマンドは
  指定したホストのポートに対してTCPでの接続をおこないます。
  その結果、PPPのプロトコルが走り始めるので、さらにPPP的にリンクの
  確立がおこなわれます。
  \begin{screen}\baselineskip12pt
    \begin{example}
ppp>{\it set device remote:2456}
ppp>{\it term}

ppp> Packet Mode
PPP>
    \end{example}
  \end{screen}
\end{enumerate}

この方法を使った場合には、相手側システムへのTCPでの接続がなされると
すぐにPPPの動作が開始されます。実際に使用する場合には、PAPあるいはCHAPを
使って接続相手を確認するのが望ましいでしょう。

\section{データの圧縮機能}
本PPPでは、Predictor-1によりデータを圧縮する機能が実装されています。
この圧縮機能を用いるとおよそ1.5:1程度の圧縮がおこなわれ、テキスト・
データの転送を高速化することができます。

圧縮機能はディフォルトで利用するようになっていますので、接続相手が
圧縮機能をもっていればCCPを使って圧縮に使用するアルゴリズムの
調停がおこなわれます。本実装ではアルゴリズムとしてPredictor-1だけ
しかサポートしていないので、接続相手が圧縮機能をもっていても別の
アルゴリズムを使用する場合には、圧縮は機能しません。

\begin{screen}\baselineskip12pt
  \begin{example}
PPP> show ccp
CCP [Opend]
myproto = PRED1, hisproto = PRED1
Input: 32860 --> 18784,  Output: 1167 --> 832
PPP> show proto
    Protocol     in        out      Protocol      in       out
   IP       :        0,        0   VJ_UNCOMP:        0,        0
   VJ_COMP  :        0,        0   COMPD    :      117,      116
   LCP      :       10,       10   IPCP     :        3,        3
   CCP      :        2,        2   PAP      :        0,        0
   LQR      :        0,        0   CHAP     :        0,        0
   Others   :        0,        0
PPP>
  \end{example}
\end{screen}

圧縮機能が使える場合には、show ccpコマンドにより、どの程度の
圧縮がかかったかを確認することができます。また、圧縮機能が使われた
場合には、PPPパケットのプロトコルは圧縮パケットとしてカプセル化されて
運ばれますので、show protoコマンドの表示の中ではCOMPDに分類されてしまう
ことに注意してください。

\section{リンク監視機能}
本PPPには、LQR機能を使って相手側が正常に動作しているかを確認する
機能があります。この機能はenable lqrコマンドによりLQRの利用が許可
されている場合に有効となります。
この監視機能では、相手側に対してLQRパケットを送出し、それに対して
応答があるかどうかを確認します。LQRパケットを5回送出しても一回も
応答がない場合には、相手はダウンしたと判断してリンクを強制的に
切断します。

接続相手がLQRプロトコルをサポートしていない場合には、LQRの代わりに
LCP ECHOを用いることにより、相手からの応答があるかどうかを検査します。
同じように連続して5回送出しても応答がない場合にはリンクを切断します。

監視用のLQR(またはLCP ECHO)パケットを送出する時間間隔はディフォルト
では30秒となっていますが、set timeoutコマンドで変更することができます。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
ppp> enable lqr
ppp> set timeout 600 60
ppp> show timeout
 Idle Timer: 600 secs   LQR Timer: 60 secs
ppp>
  \end{verbatim}
\end{screen}

\section{専用線での接続}
専用線を使って接続する場合には、起動時に{--dedicated}を指定します。

\begin{screen}
  \begin{verbatim}
% ppp -dedicated
  \end{verbatim}
\end{screen}

専用線モードを指定した場合には、モデムのキャリアを検出すると
自動的に相手との接続をおこないます。この際、相手も直接PPPを話すと
仮定していますので、DialScriptやLoginScriptは参照されずにすぐにLCPの
やりとりが開始されることに注意してください。

また、キャリアが落ちた場合にはプログラムは再びキャリアが上がるのを
待ち、動作が終了することはありません。プログラムの動作を終了させる
にはTERMシグナルを送るか、telnetでの接続をおこない\verb|quit all|
コマンドを実行してください。

現在、PPPプログラムはモデム同士が自動的に接続をおこなってくれる
ことを前提としています。

% Local Variables: 
% mode: japanese-LaTeX
% TeX-master: "guide"
% End: 
